<?php

namespace Mogod\Core\Data\Driver\Pdo;

/**
 *
 * Драйвер PDO
 *
 * @author goorus, morph
 *
 */
class PdoQueryTranslator
	extends \Mogod\Core\Data\Driver\QueryTranslatorAbstract
{

	/**
	 * @inject
	 * @var \Mogod\Core\DependencyInjection\ServiceManager
	 */
	protected $serviceManager;

	/**
	 * Возвращает рендер
	 *
	 * @param string $name
	 * @return \Mogod\Core\Data\Driver\Pdo\PartTranslator\PdoPartTranslatorAbstract
	 */
	public function getRender($name)
	{
		$class = __NAMESPACE__ . '\\PartTranslator\\PdoPartTranslator' . $name;

		return $this->serviceManager->get($class, $this);
	}

	/**
	 * Преобразует запрос к необходимому для выполнения драйвером формату.
	 *
	 * @param \Mogod\Core\Query\Query
	 */
	public function translate($query)
	{
		$translated = new \Mogod\Core\Data\Driver\Pdo\PdoTranslatedQuery;
		$this->translateTo($query, $translated);
		return $translated;
	}

	/**
	 * Перевод запроса
	 *
	 * @param \Mogod\Core\Query\Query $query
	 * @param \Mogod\Core\Data\Driver\Pdo\PdoTranslatedQuery $translated
	 */
	public function translateTo(\Mogod\Core\Query\Query $query,
		\Mogod\Core\Data\Driver\Pdo\PdoTranslatedQuery $translated)
	{
		$renders = array(
			'Explain',
			'Term',
			'CalcFoundRows',
			'Distinct',
			$query->getMainType(),
			'Set',
			'Values',
			'From',
			'ForceIndex',
			'Where',
			'Group',
			'Having',
			'Order',
			'Limit'
		);
		foreach ($renders as $render) {
			$this->getRender($render)->translate($query, $translated);
		}
	}

}
